package com.xuecheng.media.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.xuecheng.media.model.po.MediaProcess;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import java.util.List;

/**
 * <p>
 * Mapper 接口
 * </p>
 *
 * @author 勾新杰
 * @since 2025-01-16
 */
public interface MediaProcessMapper extends BaseMapper<MediaProcess> {

    /**
     * 获取待处理任务
     * @param shardTotal 分片总数
     * @param shardIndex 分片序号
     * @param count 每次获取记录数
     * @return 获取到的任务
     */
    @Select("select * from xcplus0107_media.media_process where id % #{shardTotal} = #{shardIndex} and (status = '1' or status = '3') and fail_count < #{maxFailCount} limit #{count}")
    List<MediaProcess> selectProcessByShardIndex(@Param("shardTotal") Integer shardTotal, @Param("shardIndex") Integer shardIndex, @Param("count") Integer count, @Param("maxFailCount") Integer maxFailCount);

    /**
     * 开始处理任务，用sql实现分布式锁，update返回的更新行数为0表示申请锁失败，为1表示申请锁成功
     * @param id 任务id
     * @return 待处理的任务id
     */
    @Update("update xcplus0107_media.media_process set status = 4 where id = #{id} and (status = '1' or status = '3') and fail_count < #{maxFailCount}")
    int startProcess(@Param("id") Long id, @Param("maxFailCount") Integer maxFailCount);

    /**
     * 超过指定时间未处理成功的任务
     * @param exceedTime 超过指定时间
     * @return 超过指定时间未处理成功的任务
     */
    List<MediaProcess> listExceedTimeProcess(Integer exceedTime);
}
